package com.yixiu.javabase.modules.datatype;

import javax.sound.midi.Soundbank;
import java.math.BigDecimal;
import java.util.Arrays;

public class DataType {

    public static void main(String[] args) {

        // 货币
        //testMoneyType();

        // string
        //testString();

        //testArray();


    }


    /**
     * 不能使用float或double存货币
     * 使用BigDecimal存货币
     */
    public static   void testMoneyType() {

        double a = 0.03;
        double b = 0.02;
        System.out.printf("%s-%s = %s \n",a,b , a - b);

        // 建议优先使用String构造方法。不要使用double类型的构造函数，否则还是会转为多精度的小数
        BigDecimal ba = new BigDecimal("0.03"); // 直接用string
        BigDecimal bb = new BigDecimal(Double.toString(0.02)); // double转为string
        System.out.printf("%s-%s = %s \n",ba.toString(),bb.toString() , ba.subtract(bb));

    }

    public static void testString() {

        // 直接赋值初始化，如果常量池(哈希表,key是字符串值,value是对象地址)存在，返回内存地址，否则创建一个新字符串对象，这叫做 字符串驻留，比如String str1 = "ABC"; 这种构造效率高。
        String a =  "hello"  ;
        String b =  "hello"  ;

        // 使用new 初始化，每次都会创建新字符串对象，String str2 = new String("ABC"); 判断字符串值是否相等，使用equals
//        String a = new String("hello" );
//        String b = new String( "hello" ) ;
        // 在Java一般使用HashCode来代表对象的地址
        System.out.printf("a hashcode %s, b hashcode %s \n",a.hashCode(),b.hashCode()); // string重写了hashCode
        System.out.printf("a in %s, b in %s \n",System.identityHashCode(a),System.identityHashCode(b)); // identityHashCode内存地址

        System.out.printf("a == b : %s \n",a == b); // 结果为true
        System.out.printf("a.equals(b): %s \n",a.equals(b));  // 结果为true


        //StringBuffer 通过 synchronized 保证线程安全
        StringBuffer buffer = new StringBuffer("hello");
        // StringBuilder操作字符串最快
        StringBuilder  sb = new StringBuilder("hello");



    }

    // 测试数组
    public static void testArray() {
        String [] arrStr = {"aa","bb"}; // 推荐这种声明方式: 类型[] 变量
        String arrStr2[] = {"aa","bb"}; // 类型 变量[] 是c++风格的。

        System.out.println(Arrays.toString(arrStr) ); // 输出数组元素
        System.out.println( Arrays.toString(arrStr2));

        // 数组类型 arrStr type:[Ljava.lang.String;
        System.out.println("arrStr type:" +  arrStr.getClass().getName());



    }

}
